home *** CD-ROM | disk | FTP | other *** search
/ USA Bestseller / USA BESTSELLER Vol 1-95 (Hepp-Computer)(1995).iso / e190 / video.asm < prev    next >
Assembly Source File  |  1995-02-20  |  5KB  |  223 lines

  1. .286
  2.  
  3. ;;    Compact model
  4.  
  5. LOCALS
  6.  
  7. ;; ----------------- UNINITIALIZED FAR DATA --------------------------
  8.  
  9. _FARBSS SEGMENT PARA PUBLIC 'FAR_BSS'
  10. PUBLIC ram_buffer
  11.  
  12.     ram_buffer DB 64016 DUP (?)   ;; buffer for reading/writing to video
  13.  
  14. _FARBSS ENDS
  15.  
  16. ;; --------------------------- CODE ----------------------------------
  17.  
  18. _TEXT SEGMENT PARA PUBLIC 'CODE'
  19.  
  20. PUBLIC _set_tweaked,_set_gmode,_fillbuf,_fillbuft
  21.  
  22. ASSUME CS:_TEXT
  23.  
  24. ;; ------------------------------------------------------------------ ;;
  25. ;;    extern "C" void set_tweaked();
  26. ;; ------------------------------------------------------------------
  27. ;;    Setup tweaked mode 13h. (320x200x256 colors, with 4 pages)
  28. ;;    Code taken from Michael Abrash's Power Graphics Programming.
  29. ;; ------------------------------------------------------------------ ;;
  30.  
  31. _set_tweaked PROC
  32.  
  33.     push si di
  34.  
  35.     mov ax,13h  ;; Use BIOS to set to mode 13h (320x200x256 colors)
  36.     int 10h
  37.  
  38. ;;   Disable chain 4 mode
  39.  
  40.     mov dx,03c4h   ;; Sequencer Index
  41.     mov al,4       ;; memory mode register
  42.     out dx,al
  43.     inc dx
  44.     in al,dx
  45.     and al,not 08h ;; turn off chain 4
  46.     or al,04h      ;; turn off odd/even
  47.     out dx,al
  48.  
  49.     mov dx,03ceh    ;; Graphics Controller Index
  50.     mov al,5        ;; graphics mode register
  51.     out dx,al
  52.     inc dx
  53.     in al,dx
  54.     and al,not 010h ;; turn off odd/even
  55.     out dx,al
  56.     dec dx
  57.     mov al,6        ;; miscellaneous register
  58.     out dx,al
  59.     inc dx
  60.     in al,dx
  61.     and al,not 02h  ;; turn off chain
  62.     out dx,al
  63.  
  64. ;; Change CRTC scanning from doubleword mode to byte mode,
  65. ;; allowing the CRTC to scan more than 64 K of video data
  66.  
  67.     mov dx,03d4h    ;; CRTC Index
  68.  
  69.     mov al,014h     ;; underline register
  70.     out dx,al
  71.     inc dx
  72.     in al,dx
  73.     and al,not 040h ;; turn off doubleword
  74.     out dx,al
  75.     dec dx
  76.     mov al,017h     ;; mode control register
  77.     out dx,al
  78.     inc dx
  79.     in al,dx
  80.     or al,040h      ;; turn off byte mode bit, so memory is scanned
  81.                     ;; for video data in a purely linear way, just
  82.                     ;; as in modes 010h and 012h
  83.     out dx,al
  84.  
  85. ;;   Clear the video memory, 8 pixels at a time
  86.  
  87.     mov dx,03c4h  ;; Sequencer Register Index
  88.     mov ax,0f02h
  89.     out dx,ax     ;; Enable writes to all four planes
  90.     mov ax,0a000h
  91.     mov es,ax
  92.     sub di,di
  93.     sub ax,ax     ;; Clear to 0
  94.     mov cx,8000h  ;; # of words in display memory
  95.     rep stosw
  96.  
  97.     pop di si
  98.     ret
  99. _set_tweaked ENDP
  100.  
  101. ;; ------------------------------------------------------------------ ;;
  102. ;;   extern "C" void set_gmode(int gmode);
  103. ;; ------------------------------------------------------------------
  104. ;;   Set graphics mode using BIOS
  105. ;; ------------------------------------------------------------------ ;;
  106.  
  107. _set_gmode PROC C
  108.     ARG gmode:WORD
  109.  
  110. ;; Save registers BIOS modifies
  111.     push si
  112.     push di
  113.  
  114.     mov ax,[gmode]
  115.     xor ah,ah    ;; function:set video mode
  116.     int 10h
  117.  
  118.     pop di
  119.     pop si
  120.     ret
  121. _set_gmode ENDP
  122.  
  123. ASSUME ES:_FARBSS
  124. ;; ------------------------------------------------------------------ ;;
  125. ;;   extern "C" void fillbuf();
  126. ;; ------------------------------------------------------------------
  127. ;;   Pretend ram_buffer is set up in a non-planar form, and fill it
  128. ;;   with random color patterns. For use by mode 13h benchmarks.
  129. ;; ------------------------------------------------------------------ ;;
  130.  
  131. _fillbuf PROC
  132.     push di
  133.     mov ax,_FARBSS
  134.     mov es,ax
  135.  
  136.     mov di,OFFSET ram_buffer
  137.     mov ax,0101h    ;; blue
  138.     mov cx,16000/2    ;; fill a quarter of screen (using WORDs)
  139.     rep stosw
  140.  
  141.     mov ax,0404h    ;; red
  142.     mov cx,16000/2    ;; next quarter
  143.     rep stosw
  144.  
  145.     mov ax,0505h    ;; magenta
  146.     mov cx,16000/2    ;; third quarter
  147.     rep stosw
  148.  
  149.     mov ax,0202h    ;; green
  150.     mov cx,16000/2    ;; last quarter
  151.     rep stosw
  152.  
  153.     mov ax,0        ;; black
  154.     mov cx,16/2        ;; fill up remaining 'extra' with black
  155.     rep stosw
  156.  
  157.     pop di
  158.     ret
  159. _fillbuf ENDP
  160.  
  161. ;; ------------------------------------------------------------------ ;;
  162. ;;   extern "C" void fillbuft();
  163. ;; ------------------------------------------------------------------
  164. ;;   Pretend ram_buffer is set up in a planar fashion, and fill it up
  165. ;;   with random color patterns. For use by Tweaked mode benchmarks.
  166. ;; ------------------------------------------------------------------ ;;
  167.  
  168. _fillbuft PROC
  169.     push di
  170.     mov ax,_FARBSS
  171.     mov es,ax
  172.  
  173.     mov di,OFFSET ram_buffer    ;; start at plane 0, top quarter
  174.     mov bx,4        ;; plane count
  175.     mov ax,0202h    ;; green
  176. @@PlaneDraw1:
  177.     mov cx,4000/2    ;; one quarter
  178.     rep stosw
  179.     add di,12000    ;; next plane
  180.  
  181.     dec bx
  182.     jnz @@PlaneDraw1
  183.  
  184.     mov di,OFFSET ram_buffer+4000    ;; start at plane 0, 2nd quarter
  185.     mov bx,4
  186.     mov ax,0505h    ;; magenta
  187. @@PlaneDraw2:
  188.     mov cx,4000/2    ;; one quarter
  189.     rep stosw
  190.     add di,12000    ;; next plane
  191.  
  192.     dec bx
  193.     jnz @@PlaneDraw2
  194.  
  195.     mov di,OFFSET ram_buffer+8000    ;; start at plane 0, 3rd quarter
  196.     mov bx,4
  197.     mov ax,0404h    ;; red
  198. @@PlaneDraw3:
  199.     mov cx,4000/2    ;; one quarter
  200.     rep stosw
  201.     add di,12000    ;; next plane
  202.  
  203.     dec bx
  204.     jnz @@PlaneDraw3
  205.  
  206.     mov di,OFFSET ram_buffer+12000    ;; start at plane 0, 4th quarter
  207.     mov bx,4
  208.     mov ax,0101h    ;; blue
  209. @@PlaneDraw4:
  210.     mov cx,4000/2    ;; one quarter
  211.     rep stosw
  212.     add di,12000    ;; next plane
  213.  
  214.     dec bx
  215.     jnz @@PlaneDraw4
  216.  
  217.     pop di
  218.     ret
  219. _fillbuft ENDP
  220.  
  221. _TEXT ENDS
  222.  
  223. END